package com.base.schema.singleton.loophole;

import java.io.ObjectStreamException;
import java.io.Serializable;

/**
 * 饿汉式 静态变量方式 (线程安全)
 * @ClassName: SingletonDemo1
 * @Description: 
 * @Author xuyou
 * @DateTime 2021年3月2日 上午10:59:43
 */
public class SingletonDemo implements Serializable {
  
	/**
	  * @Fields serialVersionUID : 
	  */
	private static final long serialVersionUID = 1L;

	//1: 构造方法私有化,外部无法使用new构造方法创建对象
	private SingletonDemo() {
		if (instence != null) {
			throw new RuntimeException("禁止通过反射获取对象实例");
		}
	}
	
	//2: 内部创建对象
	private static SingletonDemo instence = new SingletonDemo();
	
	//3: 提供一个对外获取实例的方法
	public static SingletonDemo getInstence() {
		return instence;
	}
	
	
	// 这个方法是基于回调的，反序列化时，如果定义了readResolve()则直接返回此方法指定的对象，而不需要在创建新的对象！
	private Object readResolve() throws ObjectStreamException{
		return instence;
	}
	
	public static void main(String[] args) {
		SingletonDemo instence1 = SingletonDemo.getInstence();
		SingletonDemo instence2 = SingletonDemo.getInstence();
		System.out.println(instence1 == instence2);
	}
	
}
